#include "cli.h"

Cli::Cli(){}
std::string Cli::cli()
{
    std::cout << "\n\t\t*****Вираз, який буде введено надійде на вхід лексичного, а потім синтаксичного аналізатора, який перевірить його правильність"
                 " у відповідності з граматикою*****\n\n";
    std::cout << "введіть вираз>";
    std::string text;
    char ch;
    while (std::cin.get(ch))
    {
        if (ch == '\n') continue;
        text += ch;
    }
    std::cout << "******************************************************************\n";
    return text;
}
void Cli::printGrammar(const std::vector<Rules> &rules)
{
    for (int i = 0; i < rules.size(); i++)
    {
        std::cout << rules[i].getNTSymbol() << "->";
        for (int j = 0; j < rules[i].size(); j++) std::cout << rules[i].getRule(j) << '|';
        std::cout << '\n';
    }
}
void Cli::printTokens(const std::vector<TokenEntry> &token_table)
{
    std::cout << "\n\tTokens table:\n";
    for (int i = 0; i < token_table.size(); i++)
        std::cout << token_table[i].token_name << '\t' << token_table[i].token_type << '\n';
    std::cout << "----------\n";
}
void Cli::printTree(TreeOutput *tree)
{
    if (tree->getParentNode() == 0) std::cout << tree->getNodeName() << '\n';
    else
        if(tree->getParentNode()->getParentNode() == 0)
            std::cout << tree->getParentNode()->getNodeName() << ":" << tree->getNodeName() << '\n';
    else
        std::cout << tree->getParentNode()->getParentNode()->getNodeName() << ":" << tree->getParentNode()->getNodeName() << ":" << tree->getNodeName() << '\n';
    for (int i = 0; i < tree->getChildNodes().size(); i++)
        printTree(tree->getChildNodes()[i]);
}
void Cli::printOperationTree(TreeOutput *tree)
{
    if ((tree->getParentNode() != 0) && (tree->getParentNode()->getParentNode() != 0))
        std::cout << tree->getParentNode()->getParentNode()->getNodeName() << ":" << tree->getParentNode()->getNodeName() << ":" << tree->getNodeName() << '\n';
    else if (tree->getParentNode() != 0) std::cout << tree->getParentNode()->getNodeName() << ":" << tree->getNodeName() << '\n';
    else  std::cout << tree->getNodeName() << '\n';
    for (int i = 0; i < tree->getChildNodes().size(); i++)
        printOperationTree(tree->getChildNodes()[i]);
}
void Cli::printIdentificatorTable(const std::map<std::string, IdentificatorEntry> &identificator_table)
{
    std::cout << "\n\tIdentificator table:\n";
    for (std::map<std::string, IdentificatorEntry>::const_iterator it = identificator_table.begin(); it != identificator_table.end(); it++)
        std::cout << "name: " << it->second.getNameVar() << '\t' << "type: " << (it->second.getTypeVar()) << '\n';
    std::cout << "\n";
}
